#include <iostream>
#include <string>
#include <math.h>
#include <fstream>
#include <algorithm>
#include <stdio.h>
#include <boost/filesystem/path.hpp>
#include <boost/program_options.hpp>
#include "get_arg.h"



// link with -lboost_filesystem-gcc -lboost_program_options-gcc
// program_options_helper.cpp
//-lboost_filesystem-gcc-d
//-L/usr/local/lib





// my functions
#include <print_error.h>
#include <program_options_helper.h>
#include <stlhelper.h>
#define DEBUG_LEVEL 6
#include <debug_func.h>
#include <blast_results.h>
#include <codeml_results.h>

using std::string;
using std::cerr;
using std::string;
using std::ofstream;
using std::ifstream;
using std::cerr;
using std::cout;
using std::max;
using boost::filesystem::path;
#define DEFAULT_CODEML_PATH "/net/cpp-group/tools/paml/"
using namespace program_options_helper;
namespace po = boost::program_options_lg;


//_______________________________________________________________________________________

//		process_command_line_options

//				from command line
//				Created [9/13/2001]

//_______________________________________________________________________________________
bool process_command_line_options(int argc, char* argv[], t_program_args& args)
{

	//
	// checked mandatory arguments
	//
	po::options_description mandatory_args("Mandatory Arguments");
	mandatory_args.add_options()
	("input_file,i",	po::value<string>(&args.file_input)
								->set_name("FILE"),
							"Any tab delimited results file with the first two columns "
							"containing the sequence identifier pairs which should be unique.");

	args.optional_args.add_options()
	("summary,s", 				po::value<string>(&args.file_summary)
										->set_name("FILE"),
									"Summary of how many identifiers have been duplicated. "
									"Repeats information found in --verbose.")
	("#comment,#",				po::value<string>(&args.comment_letters)
										->set_name("LETTERS")
										->default_value("#"),
									"Use one of these letters to begin a "
									"commented line.");


	args.add_std_options();
	po::options_description all_args("");
	all_args.
		add(mandatory_args).
		add(args.optional_args);

	// parse command line
	po::variables_map vm;
	po::store(po::command_line_parser(argc, argv).options(all_args).run(), vm);
	po::notify(vm);

	if (vm.count("version"))
	{
		print_version(cerr, *argv, "1.2\n"
			"\tHistory: \n\n"
			"\tv 1.0"
			"13-01-2005\1"
			"First Version\1"
			"Makes two passes and uses hashes. Which is why STDIN is not used.\n"
			"\tv 1.1\1"
			"04-01-2006\1"
			"For Andreas: Hash start comment lines. Fix bugs in handling input. "
			"Upgrade to common code for sequence pair identifiers\n"
			"\tv 1.2\1"
			"27-03-2006\1"
			"Comments can begin with user-defined letters. Defaults to hash '#'\n"
			);
		return false;
	}
	if (vm.count("help"))
	{
		string exe_description =
					"Takes sequence pair results and removes duplicates.\n";

		print_usage(cerr, string(*argv), "--input_file FILE\n[OPTIONS]\n"
											" > UNIQUE.RESULTS",
							all_args, exe_description, 80);
		return false;
	}
	//check_required_options(vm, mandatory_args);
	if (args.file_input.empty() || args.file_input == "STDIN")
		throw std::runtime_error("Please specify the file name in the --input_file option.\n"
								"This programme requires two passes over the data for "
								"efficiency and hence does not use STDIN.\n");


	args.open_err_log();
	return true;
}













